//go:build windows
// +build windows

package main

import (
	"net"
	"syscall"
	"unsafe"
)

// 设置TCP接收缓冲区大小 - Windows实现
// 通过调用Windows API设置SO_RCVBUF套接字选项
func setSocketRecvBuffer(conn *net.TCPConn, size int) error {
	// 获取TCP连接的底层文件句柄
	rawConn, err := conn.SyscallConn()
	if err != nil {
		return err
	}

	var syscallErr error
	// 在连接的文件句柄上执行控制操作
	controlErr := rawConn.Control(func(fd uintptr) {
		// 调用Windows专用函数设置套接字选项
		syscallErr = setsockoptWindows(int32(fd), size)
	})

	if controlErr != nil {
		return controlErr
	}
	return syscallErr
}

// Windows专用实现
// 通过调用ws2_32.dll中的setsockopt函数设置套接字选项
func setsockoptWindows(fd int32, size int) error {
	// 加载Windows网络库ws2_32.dll
	dll := syscall.MustLoadDLL("ws2_32.dll")

	// 获取setsockopt函数地址
	setSockOpt := dll.MustFindProc("setsockopt")

	// 调用setsockopt函数设置SO_RCVBUF选项
	ret, _, err := setSockOpt.Call(
		uintptr(fd),                    // 套接字句柄
		uintptr(syscall.SOL_SOCKET),    // 套接字级别
		uintptr(syscall.SO_RCVBUF),     // 选项名称：接收缓冲区大小
		uintptr(unsafe.Pointer(&size)), // 选项值：缓冲区大小
		uintptr(unsafe.Sizeof(size)),   // 选项长度
	)

	// 如果返回值不为0，表示调用失败
	if ret != 0 {
		return err
	}
	return nil
}
